package com.sxkf.template.utils;




import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sxkf.template.entity.SysConfig;
import com.sxkf.template.service.SysConfigService;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.exception.SxkfException;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;


@Slf4j
@Component
public class TencentMapUtil {

    @Resource
    private SysConfigService sysConfigService;


    //在腾讯地图申请的应用Key


    private static final String API_KEY = "";



    /**
     * 根据两个定位点的经纬度算出两点间的最短距离
     * ！！！腾讯位置服务获取到的endLonLat  纬度在前，经度在后！！！
     *
     * @param startLonLat 起始经纬度
     * @param endLonLat   结束经纬度（目标经纬度）
     * @return 两个定位点之间的最短距离（单位：米）
     */
    public long getDistance(String startLonLat, String endLonLat) {

        SysConfig one = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>()
                .eq(SysConfig::getConfigKey, "map_key"));
        String apikey = one.getConfigValue();

        // ！！！腾讯位置服务获取到的endLonLat  纬度在前，经度在后！！！

        String BASE_URL = "https://apis.map.qq.com/ws/direction/v1/driving/";
        String[] start = startLonLat.split(",");
        String[] end = endLonLat.split(",");
        // 起点经度
        String startLongitude = start[1];
        // 起点纬度
        String startLatitude = start[0];

        // ！！！腾讯位置服务获取到的endLonLat  纬度在前，经度在后！！！

        // 终点经度
        String endLongitude = end[1];
        // 终点纬度
        String endLatitude = end[0];

        // 这里经纬度反过来了，所以 必须 上面的 切
        // 调用腾讯地图的距离计算API
//        String distanceUrl = BASE_URL + "?from=" + startLatitude + "," + startLongitude + "&to=" + endLatitude + "," + endLongitude + "&output=json&key=" + apikey;

        String distanceUrl = BASE_URL + "?from=" + startLonLat + "&to=" + endLonLat + "&output=json&key=" + apikey;

        System.out.println("distanceUrl = " + distanceUrl);
        JSONObject response = HttpUtil.get(distanceUrl, null);
        Integer status = response.getInteger("status");
        // 请求异常
        if (!status.equals(0)){
            if (status.equals(373)){
                throw new SxkfException(500,response.getString("message"));
            }
            if (status.equals(121)){
                throw new SxkfException(500,response.getString("message"));
            }
            log.info("返回内容：{}", response);
            throw new SxkfException(500,"请求失败！");
        }
        // 请求成功

        // 搜索结果
        JSONObject result = response.getJSONObject("result");
        // 路线方案可能有多种路线方案
        JSONArray routes = result.getJSONArray("routes");
        Long res = 0L;
        // 遍历获取最短距离
        for (Object route : routes) {
            JSONObject oneRoute = JSON.parseObject(JSON.toJSONString(route));
            Long distance = oneRoute.getLong("distance");
            if (res == 0 || res > distance){
                res = distance;
            }

        }
        // todo 米转千米
        return res / 1000;
    }



    /**
     * 将经纬度getLng， getLat 通过getAMapByLngAndLat方法转换地址
     *
     * @param getLng 经度
     * @param getLat 纬度
     * @return 地址名称
     * @throws Exception
     */
    public String getAMapByLngAndLat(String getLng, String getLat) throws Exception {

        SysConfig one = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>()
                .eq(SysConfig::getConfigKey, "map_key"));
        String apikey = one.getConfigValue();

        // 请求URL
        String BASE_URL = "https://apis.map.qq.com/ws/geocoder/v1/?location=";
        // 请求参数
        String distanceUrl = BASE_URL + getLat + "," + getLng + "&key=" + apikey + "&output=json";
        System.out.println(distanceUrl);
        JSONObject response = HttpUtil.get(distanceUrl, null);
        Integer status = response.getInteger("status");
        // 请求异常
        if (status != 0){
            log.info("返回内容：{}", response);
            throw new SxkfException(500,"请求失败！");
        }
        // 请求成功
        // 逆地址解析结果
        JSONObject result = response.getJSONObject("result");
        // 以行政区划+道路+门牌号等信息组成的标准格式化地址
        String address = result.getString("address");
        // 地址部件，address不满足需求时可自行拼接
        JSONObject addressComponent = result.getJSONObject("address_component");
        // 国家
        String nation = addressComponent.getString("nation");
        // 省
        String province = addressComponent.getString("province");
        // 市，如果当前城市为省直辖县级区划，city与district字段均会返回此城市
        String city = addressComponent.getString("city");
        StringBuffer resAddress = new StringBuffer();
        // 为了方便，以"-"分隔。
        String res = resAddress.append(nation).append("-").append(province).append("-").append(city).append("-").append(address).toString();
        return res;

    }

    /**
     * 1.地址转换为经纬度
     *
     * @param address 地址
     * @return 经纬度
     */
    public String getLonLat(String address) {

        SysConfig one = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>()
                .eq(SysConfig::getConfigKey, "map_key"));
        String apikey = one.getConfigValue();

        // 请求URL
        String BASE_URL = "https://apis.map.qq.com/ws/geocoder/v1/?address=";
        // 请求参数
        String distanceUrl = BASE_URL + address + "?key=" + apikey + "&output=json";

        JSONObject response = HttpUtil.get(distanceUrl, null);
        Integer status = response.getInteger("status");
        // 请求异常
        if (!status.equals("0")){
            log.info("返回内容：{}", response);
            throw new SxkfException(500,"请求失败！");
        }
        // 请求成功
        JSONObject result = response.getJSONObject("result");
        // 解析到的坐标（GCJ02坐标系）
        JSONObject location = result.getJSONObject("location");
        // 经度
        Double lng = location.getDouble("lng");
        // 纬度
        Double lat = location.getDouble("lat");

        StringBuffer buildRes = new StringBuffer();
        String res = buildRes.append(lng).append(",").append(lat).toString();
        return res;
    }




}
